package fr.ul.ade.secunde.sync;

import java.util.List;

import android.database.Cursor;
import android.database.MatrixCursor;
import fr.ul.ade.secunde.util.AdeWebCollections;

/**
 * Classe contenant les différences majeures entre deux version temporelles d'un
 * emplois du temps.
 * 
 * @author Michaël Schnell
 * @since Jul 28, 2013
 * 
 * @version 1.3
 */
public class ScheduleDiff {

	/**
	 * Cours ajoutés/modifiés/supprimés récémment dans la nouvelle version.
	 */
	private MatrixCursor recent;

	/**
	 * Cours ajoutés dans la nouvelle version.
	 */
	private MatrixCursor inserted;

	/**
	 * Cours modifiés dans la nouvelle version.
	 */
	private MatrixCursor modified;

	/**
	 * Cours supprimées dans la nouvelle version.
	 */
	private MatrixCursor deleted;

	public ScheduleDiff() {
	}

	public void prepare() {
		if (this.recent != null) {
			this.recent.close();
		}
		if (this.inserted != null) {
			this.inserted.close();
		}
		if (this.modified != null) {
			this.modified.close();
		}
		if (this.deleted != null) {
			this.deleted.close();
		}
		this.recent = new MatrixCursor(LessonQuery.PROJECTION);
		this.inserted = new MatrixCursor(LessonQuery.PROJECTION);
		this.modified = new MatrixCursor(LessonQuery.PROJECTION);
		this.deleted = new MatrixCursor(LessonQuery.PROJECTION);
	}

	public void insertLesson(final Cursor lesson) {
		// FIXME Check to add to recent
		this.inserted.addRow(getValues(lesson));
	}

	public void modifyLesson(final Cursor lesson) {
		// FIXME Check to add to recent
		this.modified.addRow(getValues(lesson));
	}

	public void deleteLesson(final Cursor lesson) {
		// FIXME Check to add to recent
		this.deleted.addRow(getValues(lesson));
	}

	private static List<?> getValues(final Cursor lesson) {
		List<Object> values = AdeWebCollections.newArrayList();
		values.add(Long.valueOf(lesson.getLong(LessonQuery._ID)));
		values.add(lesson.getString(LessonQuery.LESSON_TITLE));
		values.add(lesson.getString(LessonQuery.LESSON_DATE));
		values.add(lesson.getString(LessonQuery.LESSON_START_TIME));
		values.add(lesson.getString(LessonQuery.LESSON_END_TIME));
		values.add(Long.valueOf(lesson.getLong(LessonQuery.LESSON_SCHEDULE)));
		values.add(Integer.valueOf(lesson.getInt(LessonQuery.LESSON_CHANGE)));
		values.add(lesson.getString(LessonQuery.LESSON_ROOMS));
		values.add(lesson.getString(LessonQuery.LESSON_GROUPS));
		values.add(lesson.getString(LessonQuery.LESSON_TEACHERS));
		values.add(lesson.getString(LessonQuery.LESSON_COLOR));
		values.add(lesson.getString(LessonQuery.LESSON_NOTE));
		values.add(lesson.getString(LessonQuery.LESSON_GUID));
		values.add(Integer.valueOf(lesson.getInt(LessonQuery.LESSON_DELETED)));
		values.add(lesson.getString(LessonQuery.LESSON_LAST_UPDATE));
		values.add(lesson.getString(LessonQuery.LESSON_OLD_DATE));
		values.add(lesson.getString(LessonQuery.LESSON_OLD_START_TIME));
		values.add(lesson.getString(LessonQuery.LESSON_OLD_END_TIME));
		values.add(lesson.getString(LessonQuery.LESSON_OLD_ROOMS));
		values.add(lesson.getString(LessonQuery.LESSON_CREATED));
		values.add(Integer.valueOf(lesson.getInt(LessonQuery.LESSON_ORDER)));
		values.add(Integer.valueOf(lesson.getInt(LessonQuery.LESSON_TYPE)));
		return values;
	}

	/**
	 * Indique si la nouvelle version a une modification majeure par rapport à
	 * l'ancienne version.
	 * 
	 * @return {@code true} s'il y a une modification majeure, {@code false}
	 *         sinon
	 */
	public boolean hasRecentChange() {
		return (this.recent.getCount() > 0);
	}

	public Cursor getRecentLessons() {
		return this.recent;
	}

	public Cursor getInsertedLessons() {
		return this.inserted;
	}

	public Cursor getModifiedLessons() {
		return this.modified;
	}

	public Cursor getDeletedLessons() {
		return this.deleted;
	}

}// class ScheduleDiff